SSM Automation の推奨 Runbook を利用できるようになった AWS Chatbot を利用して ECS タスクの停止理由を調査してみた
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
先日、AWS Chatbot が Systems Manager Automation の追加で 20 個の推奨ランブックをサポートしました。とても素晴らしいアップデートですね。
アップデートの内容を見るに ECS の停止理由を調査するランブックが実行できそうですね。
With this launch, customers can run AWS Systems Manager automations to resolve issues when they receive AWS Security Hub and Amazon ECS event notifications in chat channels. AWS Chatbot displays contextual action buttons on Security Hub and ECS event notifications and customers can click on them to run automations to resolve the finding. For example, they can run the automation to disable public accessibility of Amazon RDS database instances or run the automation to troubleshoot why an Amazon ECS task in an Amazon ECS cluster failed to start.
そこで今回は ECS のタスク停止理由を、今回のアップデートを使って調査してみようと思います。
IAM ロールの作成
まずは IAM ロールの作成を行います。チャンネルロールとユーザーロールを作成します。
ともに ReadOnlyAccess を設定します。後ほど説明しますが、今回のアップデートはユーザーロールを主に利用する仕組みのようです。
信頼ポリシーは両方以下で設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "chatbot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
SNS
続いて SNS トピックの作成です。スタンダードトピックで設定します。
](https://devio2024-media.developers.io/image/upload/v1722413937/2024/07/31/exfsnjxbxhpgzgeaaobq.png)
Terraform など IaC で作成する場合は以下のように EventBridge から通知を受け取れるようトピックポリシーを更新しましょう。
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:Publish",
"SNS:RemovePermission",
"SNS:SetTopicAttributes",
"SNS:DeleteTopic",
"SNS:ListSubscriptionsByTopic",
"SNS:GetTopicAttributes",
"SNS:AddPermission",
"SNS:Subscribe"
],
"Resource": "arn:aws:sns:ap-northeast-1:123456789012:ecs-stop-topic",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "123456789012"
}
}
},
{
"Sid": "AWSEvents_ecs-stop-rule_Idc9711eb8-30d6-4fb8-a20c-660e8ec60234",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:ap-northeast-1:123456789012:ecs-stop-topic"
}
]
}
EventBridge
EventBridge の設定を行います。
イベントパターンは停止を通知する ECS クラスターをフィルタリングして設定します。
{
"source": ["aws.ecs"],
"detail-type": ["ECS Task State Change"],
"detail": {
"clusterArn": [
"arn:aws:ecs:ap-northeast-1:123456789012:cluster/sample-ecs"
],
"desiredStatus": ["STOPPED"],
"lastStatus": ["STOPPED"]
}
}
ターゲットは先ほど作成した SNS トピックを選択します。
SNS へ飛ばすイベントの内容は、一致したイベント
を選択します。
インプットトランスフォーマーを利用すると今回のアップデートは利用できませんでした。
Chatbot
チャンネル設定
最後に Chatbot のチャンネル設定を作成します。名前はチャンネル名は適宜変更してください。
続いてロール設定です。先ほど作成したチャンネルロールを選択します。
通知も適切な SNS トピックを選びましょう。
ユーザーロール
ユーザーロールの設定です。ユーザーロール
タブから先ほど作成したユーザーロールを設定します。
Slack と AWS App の認証が走るため 許可する
をクリックします。
認証が完了すると、以下のようにユーザーロールが設定されます。
Slack チャンネル側も次のように、認証成功しました!とメッセージが来ていますね。
ECS タスクの停止
それでは ECS タスクの停止を行います。 EventBridge で設定した ECS クラスター内の ECS タスクを停止します。
ECS タスク停止理由の調査
Slack に通知が来ました。見慣れない Get info
というボタンが生えていますね。
ちなみに、以前はこのような通知でした。
Get info
を押すと 2 つのメッセージがスレッドに続くように返信されています。
1 つは、オプションを引数に詳細が確認しますか?と聞かれて、もう 1 つはコマンドが実行された結果が返ってきていますね。
詳細を確認すると、チャットボットのユーザーロールで停止された ECS タスクの詳細が確認できていますね。AWS にログインせずにこの情報が見られるのは嬉しいですね。
参考までに次の内容が表示されていました。
Tasks (1):
- CapacityProviderName: FARGATE
Attributes (1):
- Name: ecs.cpu-architecture
Value: arm64
ClusterArn: arn:aws:ecs:ap-northeast-1:123456789012:cluster/sample-ecs
Attachments (1):
- Id: 9bd41c21-58c6-4914-a2a7-8a1c9ee6ca97
Type: ElasticNetworkInterface
Status: DELETED
Details (5):
-
Name: subnetId
Value: subnet-0ed7f489cdcc88d18
-
Name: networkInterfaceId
Value: eni-0830b0c954bf9233f
-
Name: macAddress
Value: 0a:7b:8f:8f:ab:03
-
Name: privateDnsName
Value: ip-10-0-25-246.ap-northeast-1.compute.internal
-
Name: privateIPv4Address
Value: 10.0.25.246
AvailabilityZone: ap-northeast-1c
Connectivity: CONNECTED
ConnectivityAt: 2025-01-14 12:51 UTC
Containers (1):
- ContainerArn: arn:aws:ecs:ap-northeast-1:123456789012:container/sample-ecs/8b0070915d314858a6d145acbf38a422/47985da5-c7f1-492b-b6c4-34a301f17882
TaskArn: arn:aws:ecs:ap-northeast-1:123456789012:task/sample-ecs/8b0070915d314858a6d145acbf38a422
Name: nginx
Image: nginx
ImageDigest: sha256:0e65e7b19ac0abab5c911b175ca20040c98200337337cbb366af24ab597927ea
RuntimeId: 8b0070915d314858a6d145acbf38a422-2531612879
LastStatus: STOPPED
ExitCode: 0
NetworkInterfaces (1):
-
AttachmentId: 9bd41c21-58c6-4914-a2a7-8a1c9ee6ca97
PrivateIpv4Address: 10.0.25.246
HealthStatus: UNKNOWN
Cpu: 0
Cpu: 512
CreatedAt: 2025-01-14 12:51 UTC
DesiredStatus: STOPPED
LaunchType: FARGATE
EnableExecuteCommand: false
ExecutionStoppedAt: 2025-01-14 13:30 UTC
Group: service:ecs-stop
LastStatus: STOPPED
HealthStatus: UNKNOWN
Memory: 1024
Overrides:
ContainerOverrides (1): -
Name: nginx
PlatformVersion: 1.4.0
PlatformFamily: Linux
PullStartedAt: 2025-01-14 12:51 UTC
PullStoppedAt: 2025-01-14 12:51 UTC
StartedAt: 2025-01-14 12:51 UTC
StartedBy: ecs-svc/9967756951932165084
StopCode: UserInitiated
StoppedAt: 2025-01-14 13:31 UTC
StoppedReason: Task stopped by user
StoppingAt: 2025-01-14 13:30 UTC
TaskArn: arn:aws:ecs:ap-northeast-1:123456789012:task/sample-ecs/8b0070915d314858a6d145acbf38a422
TaskDefinitionArn: arn:aws:ecs:ap-northeast-1:123456789012:task-definition/nginx-samples:6
Version: 7
EphemeralStorage:
SizeInGiB: 20
FargateEphemeralStorage:
SizeInGiB: 20
もう片方の詳細について触れていきましょう。
すると --include
引数で渡すパラメーターを求められました。ただ、 --include
引数が何を入れるのかわかりません。Help
を押してみます。
Help を押すと ecs describe-tasks
の説明が出てきました。
Example ではどのようにコマンドを実行するか例題が記載されていますね(肝心の --include
は指定がないですが。)
Parameters を押すと指定したかった include
の情報が出てきましたね。タグを指定するようです。
ECS タスクにタグを付与していないため今回はコマンドはキャンセルしました。
まとめ
以上、「SSM Automation の推奨 Runbook を利用できるようになった AWS Chatbot を利用して ECS タスクの停止理由を調査してみた」でした。
追加の 20 個がどのアクションなのかドキュメントから探しきれず、ひとまず ECS でどのような動きになるのか確認してみました。わざわざ AWS コンソールにログインせずに見られるのはとても便利ですね。
このブログが参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!